$.fn.serializeJson = function () {
    let json = {};
    $.each(this.serializeArray(), function(index, field) {
        if(json[field.name]) {
            json[field.name] += ("," + field.value);
        } else {
            json[field.name] = field.value;
        }
    });
    let $radioCheck = $('input[type=radio],input[type=checkbox]', this);
    $.each($radioCheck, function(){
        if(!json.hasOwnProperty(this.name)) {
            json[this.name] = '';
        }
    });
    return json;
};

/**
 * 序列化表单为json信息保存到storage中
 * @param obj
 * @returns json对象
 */
function serialFormJsonToStorage(obj) {
    // 获取storage中item名和json对象
    let storageItemName = obj.item || "defaultStorageFormJson";
    let storageJson = JSON.parse(window.localStorage.getItem(storageItemName) || "{}");

    // form表单id值
    let formId = obj.formId || "form";
    // 合并本次form表单序列化json结果到storageJson中
    $.extend(storageJson, $("#" + formId).serializeJson());

    // 数据处理函数,可处理需要特殊解析的值
    if (obj.handle) {
        obj.handle(storageJson);
    }
    // 把json信息保存入storage中
    window.localStorage.setItem(storageItemName, JSON.stringify(storageJson));
    return storageJson;
}

/**
 * 解析storage中json对象并加载到对应form表单
 * @param obj
 */
function loadStorageJsonToForm(obj) {
    let storageItemName = obj.item || "defaultStorageFormJson";
    let formId = obj.formId || "form";
    let handle = obj.handle;

    // storage中json对象
    let storageJson = JSON.parse(window.localStorage.getItem(storageItemName) || "{}");
    // 本次待加载form对象
    let formObj = $("#" + formId);

    // 控制台输出json，实际使用可注释或删除
    console.log(storageJson);

    // 数据处理函数，json数据加载前处理
    if (handle) {
        handle(storageJson);
    }
    // 加载json信息到form表单中
    loadJsonToForm(formObj, storageJson);
}

/**
 * 加载json信息到form表单中
 * @param formObj form表单对象
 * @param json 待解析json对象
 */
function loadJsonToForm(formObj, json) {
    $.each(json, function (name, value) {
        switch (formObj.find(":input[name=" + name + "]").attr("type")) {
            case "checkbox":
                // 数组格式
                if (Object.prototype.toString.apply(value) == '[object Array]') {
                    for (var i = 0; i < value.length; i++) {
                        if ($(this).val() == value[i])
                            $(this).attr("checked", "checked");
                    }
                } else { // 非数组格式，本demo中使用的是此格式
                    let valueArray = value.split(",");
                    formObj.find("[name=" + name + "]").each(function () {
                        for (var i = 0; i < valueArray.length; i++) {
                            if ($(this).val() == valueArray[i]) {
                                $(this).attr("checked", "checked");
                            }
                        }
                    });
                }
                break;
            case "radio":
                formObj.find("[name=" + name + "]").each(function () {
                    if ($(this).val() == value) {
                        $(this).attr("checked", "checked");
                    }
                });
                break;
            case "textarea":
                formObj.find("[name=" + name + "]").html(value);
                break;
            default:
                formObj.find("[name=" + name + "]").val(value);
        }
    });
}
